#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/select.h"
#include "sys/time.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include "poll.h"
#include "signal.h"

static int fd = 0; /* 文件描述符 */

/*
 * @description		: SIGIO 信号处理函数
 * @param - signum  : 信号值
 * @return 			: 无
 */
static void sigio_signal_func(int signum)
{
	int err = 0;
	unsigned int keyvalue = 0;
	err = read(fd, &keyvalue, sizeof(keyvalue));
	if (err < 0)
	{
		// printf("data unvalid.\r\n");
	}
	else if (keyvalue) 
	{	
		printf("key value = %#X\r\n", keyvalue);
	}
}

/*
 * @description		: main主程序
 * @param - argc 	: argv数组元素个数
 * @param - argv 	: 具体参数
 * @return 			: 0 成功;其他 失败
 */
int main(int argc, char *argv[])
{
	int flags;
	char *filename;

	if(argc != 2){
		printf("Error Usage!\r\n");
		return -1;
	}

	filename = argv[1];

	/* 打开key驱动 */
	fd = open(filename, O_RDWR | O_NONBLOCK);
	if(fd < 0)
	{
		printf("file %s open failed!\r\n", argv[1]);
		return -1;
	}

	/* 设置信号 SIGIO 的处理函数 */
	signal(SIGIO, sigio_signal_func);
	fcntl(fd, F_SETOWN, getpid());
	flags = fcntl(fd, F_GETFD);
	fcntl(fd, F_SETFL, flags | FASYNC);

	while(1)
	{
		sleep(2);
	}

	close(fd); /* 关闭文件 */
	return 0;
}
